#include<bits/stdc++.h>
#define sd(n) scanf("%d",&n) 
#define sld(n) scanf("%lld",&n)
#define pd(n) printf("%d", (n))
#define pld(n) printf("%lld", n)
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define fi first
#define se second
const int N=2e5;
const int maxn=1e6;
typedef long long int ll;
using namespace std;
//----------------------------------------------------------------------------//
struct node
{
	int h;
	int p;
};

bool comp(struct node a,struct node b)//用于sort比较node节点
{
	return a.p<b.p;
}

void solve()
{
	int n,k;
	sd(n);sd(k);
	vector<struct node> a(n);

	for(int i=0;i<n;i++) sd(a[i].h);
	for(int i=0;i<n;i++) sd(a[i].p);

	sort(all(a),comp);
	
	int sum=0;//遍历每一个位,sum记录上一个数减去的总和
	bool judge=true;
	for(int i=0;i<n;i++)
	{
		if((k+sum-a[i].h)>=0||sum>a[i].h) continue;//当某个位置能减去sum+k或者sum小于0时满足条件,k不用更新

		else//此时k要更新
		{
			a[i].h-=sum;
			while(a[i].h>0&&k>0)//要减到h小于0或者k小于0时退出更新
			{
				a[i].h-=k;
				sum+=k;

				if(a[i].h>0) k-=a[i].p;
				else if (i<n&&i!=n-1) k-=a[i+1].p;//当刚好减到a[i].h<0,此时的最小p已经是下一位了
			}

			if(k<=0&&a[i].h>0)
			{
				judge=false;
				break;
			}
		}

	}
	if(judge==true) cout<<"YES"<<'\n';
	else cout<<"NO"<<'\n';
}

int main()
{
	int T;
	sd(T);
	while (T--)
	{
		solve();
	}
	return 0;
}